home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / Asm / AB3DIIsrc / source_4000 / hireswall.s < prev    next >
Encoding:
Text File  |  1996-07-01  |  36.9 KB  |  2,729 lines

  1.     dc.w 0
  2. leftclip: dc.w 0
  3.     dc.w 0
  4. rightclip: dc.w 0
  5. deftopclip: dc.w 0
  6. defbotclip: dc.w 0
  7. leftclipandlast: dc.w 0
  8.  
  9. SCALE MACRO
  10.  dc.w 64*0
  11.  dc.w 64*1
  12.  dc.w 64*1
  13.  dc.w 64*2
  14.  dc.w 64*2
  15.  dc.w 64*3
  16.  dc.w 64*3
  17.  dc.w 64*4
  18.  dc.w 64*4
  19.  dc.w 64*5
  20.  dc.w 64*5
  21.  dc.w 64*6
  22.  dc.w 64*6
  23.  dc.w 64*7
  24.  dc.w 64*7
  25.  dc.w 64*8
  26.  dc.w 64*8
  27.  dc.w 64*9
  28.  dc.w 64*9
  29.  dc.w 64*10
  30.  dc.w 64*10
  31.  dc.w 64*11
  32.  dc.w 64*11
  33.  dc.w 64*12
  34.  dc.w 64*12
  35.  dc.w 64*13
  36.  dc.w 64*13
  37.  dc.w 64*14
  38.  dc.w 64*14
  39.  dc.w 64*15
  40.  dc.w 64*15
  41.  dc.w 64*16
  42.  dc.w 64*16
  43.  dc.w 64*17
  44.  dc.w 64*17
  45.  dc.w 64*18
  46.  dc.w 64*18
  47.  dc.w 64*19
  48.  dc.w 64*19
  49.  dc.w 64*20
  50.  dc.w 64*20
  51.  dc.w 64*21
  52.  dc.w 64*21
  53.  dc.w 64*22
  54.  dc.w 64*22
  55.  dc.w 64*23
  56.  dc.w 64*23
  57.  dc.w 64*24
  58.  dc.w 64*24
  59.  dc.w 64*25
  60.  dc.w 64*25
  61.  dc.w 64*26
  62.  dc.w 64*26
  63.  dc.w 64*27
  64.  dc.w 64*27
  65.  dc.w 64*28
  66.  dc.w 64*28
  67.  dc.w 64*29
  68.  dc.w 64*29
  69.  dc.w 64*30
  70.  dc.w 64*30
  71.  dc.w 64*31
  72.  dc.w 64*31
  73.  dc.w 64*31
  74.  dc.w 64*31
  75.  dc.w 64*31
  76.  dc.w 64*31
  77.  dc.w 64*31
  78.  dc.w 64*31
  79.  dc.w 64*31
  80.  dc.w 64*31
  81.  dc.w 64*31
  82.  dc.w 64*31
  83.  dc.w 64*31
  84.  dc.w 64*31
  85.  dc.w 64*31
  86.  dc.w 64*31
  87.  dc.w 64*31
  88.  dc.w 64*31
  89.  dc.w 64*31
  90.  dc.w 64*31
  91.  ENDM
  92.  
  93. *********************************** 
  94.  
  95. * The screendivide routine is simpler
  96. * using a0=left pixel
  97. * a2= right pixel
  98. * d0= left dist
  99. * d2= right dist
  100. * d4 = left strip
  101. * d5 = right strip
  102.  
  103. * (a0)=leftx
  104. * 2(a0)=rightx
  105.  
  106. * 4(a0)=leftbm
  107. * 6(a0)=rightbm
  108.  
  109. * 8(a0)=leftdist
  110. * 10(a0)=rightdist
  111.  
  112. * 12(a0)=lefttop
  113. * 14(a0)=righttop
  114.  
  115. * 16(a0)=leftbot
  116. * 18(a0)=rightbot
  117.  
  118.  
  119. Doleftend:
  120.  
  121.  move.w leftclip,d0
  122.  sub.w #1,d0
  123.  move.w d0,leftclipandlast
  124.  
  125.  
  126.  move.w (a0),d0
  127.  move.w 2(a0),d1
  128.  sub.w d0,d1
  129.  bge.s sometodraw
  130.  rts
  131. sometodraw:
  132.  move.w itertab(pc,d1.w*4),d7
  133.  swap d0
  134.  move.w itertab+2(pc,d1.w*4),d6
  135.  clr.w d0
  136.  swap d1
  137.  clr.w d1
  138.  asr.l d6,d1
  139.  move.l d1,(a0)
  140.  
  141.  bra pstit
  142.  
  143. itertab:
  144.  incbin "ab3:includes/iterfile"
  145.  
  146. pstit:
  147.  
  148.  moveq #0,d1
  149.  move.w 4(a0),d1
  150.  moveq #0,d2
  151.  move.w 6(a0),d2
  152.  sub.w d1,d2
  153.  swap d1
  154.  swap d2
  155.  asr.l d6,d2
  156.  move.l d2,4(a0)
  157.  
  158.  moveq #0,d2
  159.  move.w 8(a0),d2
  160.  moveq #0,d3
  161.  move.w 10(a0),d3
  162.  sub.w d2,d3
  163.  swap d2
  164.  swap d3
  165.  asr.l d6,d3
  166.  move.l d3,8(a0)
  167.  
  168.  moveq #0,d3
  169.  move.w 12(a0),d3
  170.  moveq #0,d4
  171.  move.w 14(a0),d4
  172.  sub.w d3,d4
  173.  swap d3
  174.  swap d4
  175.  asr.l d6,d4
  176.  move.l d4,12(a0)
  177.  
  178.  moveq #0,d4
  179.  move.w 16(a0),d4
  180.  moveq #0,d5
  181.  move.w 18(a0),d5
  182.  sub.w d4,d5
  183.  swap d4
  184.  swap d5
  185.  asr.l d6,d5
  186.  move.l d5,16(a0)
  187.  
  188.  
  189. *** Gouraud shading ***
  190.  moveq #0,d5
  191.  move.w 26(a0),d5
  192.  sub.w 24(a0),d5
  193.  add.w d5,d5
  194.  swap d5
  195.  asr.l d6,d5
  196.  move.l d5,28(a0)
  197.  moveq #0,d5
  198.  move.w 24(a0),d5
  199.  add.w d5,d5
  200.  swap d5
  201.  
  202.  bra screendivide
  203.  
  204. itercount: dc.w 0
  205.  
  206. screendividethru:
  207.  
  208. .scrdrawlop:
  209.  
  210.  move.w (a0)+,d0
  211.  move.l FASTBUFFER,a3
  212.  move.l (a0)+,d1
  213.  
  214.  bra .pastscrinto
  215.  
  216. .scrintocop:
  217.  incbin "ab3:includes/XTOCOPX"
  218.  
  219. .pastscrinto 
  220.  
  221.  swap d1
  222.  
  223.  move.w d1,d6
  224.  and.w HORAND,d6
  225.  move.l (a0)+,d2
  226.  swap d2
  227.  add.w fromtile(pc),d6
  228.  add.w d6,d6
  229.  move.w d6,a5
  230.  move.l (a0)+,d3
  231.  swap d3
  232.  add.l #divthreetab,a5
  233.  move.w (a5),StripData
  234.  
  235.  move.l ChunkAddr,a5
  236.  moveq #0,d6
  237.  move.b StripData,d6
  238.  add.w d6,d6
  239.  move.w VALSHIFT,d4
  240.  asl.l d4,d6
  241.  add.l d6,a5
  242.  move.l (a0)+,d4
  243.  swap d4
  244.  move.w d2,d6
  245. ***************************
  246. * old version
  247.  asr.w #7,d6
  248. ***************************
  249. ; asr.w #3,d6
  250. ; sub.w #4,d6
  251. ; cmp.w #6,d6
  252. ; blt.s tstbrbr
  253. ; move.w #6,d6
  254. ;tstbrbr:
  255. ***************************
  256.  add.w angbright(pc),d6
  257.  bge.s .brnotneg
  258.  moveq #0,d6
  259. .brnotneg
  260.  cmp.w #32,d6
  261.  blt.s .brnotpos
  262.  move.w #32,d6
  263. .brnotpos
  264.  move.l PaletteAddr,a2
  265.  move.l a2,a4
  266.  add.w .ffscrpickhowbright(pc,d6*2),a2
  267. ; and.b #$fe,d6
  268. ; add.w .ffscrpickhowbright(pc,d6*2),a4
  269.  
  270. ; btst #0,d0
  271. ; beq .nobrightswap
  272. ; exg a2,a4
  273. ;.nobrightswap:
  274.  
  275.  move.w d7,-(a7)
  276.  bsr ScreenWallstripdrawthru
  277.  move.w (a7)+,d7
  278.  
  279.  dbra d7,.scrdrawlop
  280.  rts
  281.  
  282. .ffscrpickhowbright:
  283.  SCALE
  284.  
  285.  
  286. ***************************
  287.  
  288. screendivide:
  289.  
  290.  or.l #$ffff0000,d7
  291.  move.w leftclipandlast(pc),d6
  292.  move.l #WorkSpace,a2
  293.  
  294.  move.l (a0),a3
  295.  move.l 4(a0),a4
  296.  move.l 8(a0),a5
  297.  move.l 12(a0),a6
  298.  move.l 16(a0),a1
  299.  move.l 28(a0),a0
  300.  
  301. scrdivlop:
  302.  
  303.  swap d0
  304.  cmp.w d6,d0
  305.  bgt scrnotoffleft
  306.  swap d0
  307.  add.l a4,d1
  308.  add.l a5,d2
  309.  add.l a6,d3
  310.  add.l a1,d4
  311.  add.l a3,d0
  312.  add.l a0,d5
  313.  dbra d7,scrdivlop
  314.  rts
  315.  
  316. scrnotoffleft:
  317.  
  318.  move.w d0,d6
  319.  
  320.  cmp.w rightclip(pc),d0
  321.  bge.s outofcalc
  322.  
  323. scrnotoffright:
  324.  
  325.  
  326.  move.w d0,(a2)+
  327.  move.l d1,(a2)+
  328.  move.l d2,(a2)+
  329.  move.l d3,(a2)+
  330.  move.l d4,(a2)+
  331.  move.l d5,(a2)+
  332.  swap d0
  333.  add.l a3,d0
  334.  add.l a4,d1
  335.  add.l a5,d2
  336.  add.l a6,d3
  337.  add.l a1,d4
  338.  add.l a0,d5
  339.  add.l #$10000,d7
  340.  dbra d7,scrdivlop
  341.  
  342. outofcalc:
  343.  swap d7
  344.  tst.w d7
  345.  bge.s .somethingtodraw
  346.  rts
  347. .somethingtodraw:
  348.  
  349.  move.l #consttab,a1
  350.  move.l #WorkSpace,a0
  351.  
  352.  tst.b FULLSCR
  353.  bne screendivideFULL
  354.  
  355. ; tst.b seethru
  356. ; bne screendividethru
  357.  
  358.  tst.b DOUBLEWIDTH
  359.  bne scrdrawlopDOUB
  360.  bra scrdrawlop
  361.  
  362. thislinedone:
  363.  add.w #4+4+4+4+4,a0
  364.  dbra d7,scrdrawlop
  365.  rts
  366.  
  367. scrdrawlop:
  368.  
  369.  move.w (a0)+,d0
  370.  
  371.  cmp.w LASTSTIRRUP,d0
  372.  beq.s thislinedone
  373.  move.w d0,LASTSTIRRUP
  374.  
  375.  move.l FASTBUFFER,a3
  376.  lea (a3,d0.w),a3
  377.  move.l (a0)+,d1
  378.  
  379.  swap d1
  380.  
  381.  move.w d1,d6
  382.  and.w HORAND,d6
  383.  move.l (a0)+,d2
  384.  swap d2
  385.  add.w fromtile(pc),d6
  386.  add.w d6,d6
  387.  move.w d6,a5
  388.  move.l (a0)+,d3
  389.  swap d3
  390.  add.l #divthreetab,a5
  391.  move.w (a5),StripData
  392.  
  393.  move.l ChunkAddr,a5
  394.  moveq #0,d6
  395.  move.b StripData,d6
  396.  add.w d6,d6
  397.  move.w VALSHIFT,d4
  398.  asl.l d4,d6
  399.  add.l d6,a5
  400.  move.l (a0)+,d4
  401.  swap d4
  402.  addq #1,d4
  403.  move.w d2,d6
  404. ***************************
  405. * old version
  406.  asr.w #7,d6
  407. ***************************
  408. ; asr.w #3,d6
  409. ; sub.w #4,d6
  410. ; cmp.w #6,d6
  411. ; blt.s tstbrbr
  412. ; move.w #6,d6
  413. ;tstbrbr:
  414. ***************************
  415.  move.l (a0)+,d5
  416.  swap d5
  417.  ext.w d5
  418.  add.w d5,d6
  419.  bge.s .brnotneg
  420.  moveq #0,d6
  421. .brnotneg
  422.  cmp.w #64,d6
  423.  blt.s .brnotpos
  424.  move.w #64,d6
  425. .brnotpos
  426.  move.l PaletteAddr,a2
  427.  move.l a2,a4
  428.  add.w ffscrpickhowbright(pc,d6*2),a2
  429.  and.b #$fe,d6
  430.  add.w ffscrpickhowbright(pc,d6*2),a4
  431.  
  432.  btst #0,d0
  433.  beq .nobrightswap
  434.  exg a2,a4
  435. .nobrightswap:
  436.  
  437.  move.w d7,-(a7)
  438.  bsr ScreenWallstripdraw
  439.  move.w (a7)+,d7
  440.  
  441. toosmall:
  442.  
  443.  dbra d7,scrdrawlop
  444.  
  445.  rts
  446.  
  447. ffscrpickhowbright:
  448.  SCALE
  449.  
  450.  
  451. thislineodd:
  452.  add.w #4+4+4+4+4,a0
  453.  dbra d7,scrdrawlopDOUB
  454.  rts
  455.  
  456. scrdrawlopDOUB:
  457.  
  458.  move.w (a0)+,d0
  459.  btst #0,d0
  460.  bne.s thislineodd
  461.  
  462.  cmp.w LASTSTIRRUP,d0
  463.  beq.s thislineodd
  464.  move.w d0,LASTSTIRRUP
  465.  
  466.  move.l FASTBUFFER,a3
  467.  lea (a3,d0.w),a3
  468.  move.l (a0)+,d1
  469.  
  470.  swap d1
  471.  
  472.  move.w d1,d6
  473.  and.w HORAND,d6
  474.  move.l (a0)+,d2
  475.  swap d2
  476.  add.w fromtile(pc),d6
  477.  add.w d6,d6
  478.  move.w d6,a5
  479.  move.l (a0)+,d3
  480.  swap d3
  481.  add.l #divthreetab,a5
  482.  move.w (a5),StripData
  483.  
  484.  move.l ChunkAddr,a5
  485.  moveq #0,d6
  486.  move.b StripData,d6
  487.  add.w d6,d6
  488.  move.w VALSHIFT,d4
  489.  asl.l d4,d6
  490.  add.l d6,a5
  491.  move.l (a0)+,d4
  492.  swap d4
  493.  addq #1,d4
  494.  move.w d2,d6
  495. ***************************
  496. * old version
  497.  asr.w #7,d6
  498. ***************************
  499. ; asr.w #3,d6
  500. ; sub.w #4,d6
  501. ; cmp.w #6,d6
  502. ; blt.s tstbrbr
  503. ; move.w #6,d6
  504. ;tstbrbr:
  505. ***************************
  506.  move.l (a0)+,d5
  507.  swap d5
  508.  ext.w d5
  509.  add.w d5,d6
  510.  bge.s .brnotneg
  511.  moveq #0,d6
  512. .brnotneg
  513.  cmp.w #64,d6
  514.  blt.s .brnotpos
  515.  move.w #64,d6
  516. .brnotpos
  517.  move.l PaletteAddr,a2
  518.  move.l a2,a4
  519.  add.w ffscrpickhowbrightD(pc,d6*2),a2
  520.  and.b #$fe,d6
  521.  add.w ffscrpickhowbrightD(pc,d6*2),a4
  522.  
  523.  btst #0,d0
  524.  beq .nobrightswap
  525.  exg a2,a4
  526. .nobrightswap:
  527.  
  528.  move.w d7,-(a7)
  529.  bsr ScreenWallstripdraw
  530.  move.w (a7)+,d7
  531.  
  532.  
  533.  dbra d7,scrdrawlopDOUB
  534.  
  535.  rts
  536.  
  537.  
  538. middleline:
  539.  dc.w 0
  540. LASTSTIRRUP: dc.w 0
  541.  
  542. ;scrintocop:
  543. ; incbin "XTOCOPX"
  544. prot4: dc.w 0
  545.  
  546. fromtile: dc.l 0
  547. fromquartertile: dc.l 0
  548. swapbrights: dc.w 0
  549. angbright: dc.w 0
  550.  
  551. leftside: dc.b 0
  552. rightside: dc.b 0
  553. firstleft: dc.w 0
  554.  
  555. ffscrpickhowbrightD:
  556.  SCALE
  557.  
  558. screendivideFULL:
  559.  
  560.  tst.b DOUBLEWIDTH
  561.  bne scrdrawlopFULLDOUB
  562.  
  563.  
  564. scrdrawlopFULL:
  565.  
  566.  move.w (a0)+,d0
  567.  move.l FASTBUFFER,a3
  568.  lea (a3,d0.w),a3
  569.  move.l (a0)+,d1
  570.  
  571. ; bra pastscrinto
  572. ;
  573. ;pastscrinto 
  574.  
  575.  swap d1
  576.  
  577.  move.w d1,d6
  578.  and.w HORAND,d6
  579.  move.l (a0)+,d2
  580.  swap d2
  581.  add.w fromtile(pc),d6
  582.  add.w d6,d6
  583.  move.w d6,a5
  584.  move.l (a0)+,d3
  585.  swap d3
  586.  add.l #divthreetab,a5
  587.  move.w (a5),StripData
  588.  
  589.  move.l ChunkAddr,a5
  590.  moveq #0,d6
  591.  move.b StripData,d6
  592.  add.w d6,d6
  593.  move.w VALSHIFT,d4
  594.  asl.l d4,d6
  595.  add.l d6,a5
  596.  move.l (a0)+,d4
  597.  swap d4
  598.  addq #1,d4
  599.  move.w d2,d6
  600. ***************************
  601. * old version
  602.  asr.w #7,d6
  603. ***************************
  604. ; asr.w #3,d6
  605. ; sub.w #4,d6
  606. ; cmp.w #6,d6
  607. ; blt.s tstbrbr
  608. ; move.w #6,d6
  609. ;tstbrbr:
  610. ***************************
  611.  move.l (a0)+,d5
  612.  swap d5
  613.  ext.w d5
  614.  add.w d5,d6
  615.  bge.s .brnotneg
  616.  moveq #0,d6
  617. .brnotneg
  618.  cmp.w #64,d6
  619.  blt.s .brnotpos
  620.  move.w #64,d6
  621. .brnotpos
  622.  move.l PaletteAddr,a2
  623.  move.l a2,a4
  624.  add.w ffscrpickhowbrightFULL(pc,d6*2),a2
  625.  and.b #$fe,d6
  626.  add.w ffscrpickhowbrightFULL(pc,d6*2),a4
  627.  
  628.  btst #0,d0
  629.  beq .nobrightswap
  630.  exg a2,a4
  631. .nobrightswap:
  632.  
  633.  move.w d7,-(a7)
  634.  bsr ScreenWallstripdrawBIG
  635.  move.w (a7)+,d7
  636.  
  637.  dbra d7,scrdrawlopFULL
  638.  
  639.  rts
  640.  
  641. ffscrpickhowbrightFULL:
  642.  SCALE
  643.  
  644. itsanoddone:
  645.  add.w #4+4+4+4+4,a0
  646.  dbra d7,scrdrawlopFULLDOUB
  647.  rts
  648.  
  649. scrdrawlopFULLDOUB:
  650.  
  651.  move.w (a0)+,d0
  652.  btst #0,d0
  653.  bne.s itsanoddone
  654.  
  655.  move.l FASTBUFFER,a3
  656.  lea (a3,d0.w),a3
  657.  move.l (a0)+,d1
  658.  
  659. ; bra pastscrinto
  660. ;
  661. ;pastscrinto 
  662.  
  663.  swap d1
  664.  
  665.  move.w d1,d6
  666.  and.w HORAND,d6
  667.  move.l (a0)+,d2
  668.  swap d2
  669.  add.w fromtile(pc),d6
  670.  add.w d6,d6
  671.  move.w d6,a5
  672.  move.l (a0)+,d3
  673.  swap d3
  674.  add.l #divthreetab,a5
  675.  move.w (a5),StripData
  676.  
  677.  move.l ChunkAddr,a5
  678.  moveq #0,d6
  679.  move.b StripData,d6
  680.  add.w d6,d6
  681.  move.w VALSHIFT,d4
  682.  asl.l d4,d6
  683.  add.l d6,a5
  684.  move.l (a0)+,d4
  685.  swap d4
  686.  addq #1,d4
  687.  move.w d2,d6
  688. ***************************
  689. * old version
  690.  asr.w #7,d6
  691. ***************************
  692. ; asr.w #3,d6
  693. ; sub.w #4,d6
  694. ; cmp.w #6,d6
  695. ; blt.s tstbrbr
  696. ; move.w #6,d6
  697. ;tstbrbr:
  698. ***************************
  699.  move.l (a0)+,d5
  700.  swap d5
  701.  ext.w d5
  702.  add.w d5,d6
  703.  bge.s .brnotneg
  704.  moveq #0,d6
  705. .brnotneg
  706.  cmp.w #64,d6
  707.  blt.s .brnotpos
  708.  move.w #64,d6
  709. .brnotpos
  710.  move.l PaletteAddr,a2
  711.  move.l a2,a4
  712.  add.w ffscrpickhowbrightFULLDOUB(pc,d6*2),a2
  713.  and.b #$fe,d6
  714.  add.w ffscrpickhowbrightFULLDOUB(pc,d6*2),a4
  715.  
  716.  btst #0,d0
  717.  beq .nobrightswap
  718.  exg a2,a4
  719. .nobrightswap:
  720.  
  721.  move.w d7,-(a7)
  722.  bsr ScreenWallstripdrawBIG
  723.  move.w (a7)+,d7
  724.  
  725.  dbra d7,scrdrawlopFULLDOUB
  726.  
  727.  rts
  728.  
  729. ffscrpickhowbrightFULLDOUB:
  730.  SCALE
  731.  
  732.  
  733. divthreetab:
  734. val SET 0
  735.  REPT 220
  736.  dc.b val,0
  737.  dc.b val,1
  738.  dc.b val,2
  739. val SET val+1
  740.  ENDR
  741.  
  742. StripData: dc.w 0
  743.  
  744. * using a0=left pixel
  745. * a2= right pixel
  746. * d0= left height
  747. * d2= right height
  748. * d4 = left strip
  749. * d5 = right strip
  750.  
  751.  
  752. * Routine to draw a wall;
  753. * pass it X and Z coords of the endpoints
  754. * and the start and end length, and a number
  755. * representing the number of the wall.
  756.  
  757. * a0=x1 d1=z1 a2=x2 d3=z2
  758. * d4=sl d5=el
  759. * a1 = strip buffer
  760.  
  761. store: ds.l 500
  762.  
  763. ******************************************************************
  764.  
  765. * Curve drawing routine. We have to know:
  766. * The top and bottom of the wall
  767. * The point defining the centre of the arc
  768. * the point defining the starting point of the arc
  769. * the start and end angles of the arc
  770. * The start and end positions along the bitmap of the arc
  771. * Which bitmap to use for the arc
  772.  
  773. xmiddle: dc.w 0
  774. zmiddle SET 2
  775.  dc.w 0
  776. xradius SET 4
  777.  dc.w 0
  778. zradius SET 6
  779.  dc.w 0
  780. startbitmap SET 8
  781.  dc.w 0
  782. bitmapcounter SET 10
  783.  dc.w 0
  784. brightmult SET 12
  785.  dc.w 0
  786. angadd SET 14
  787.  dc.l 0
  788. xmiddlebig SET 18
  789.  dc.l 0
  790. basebright SET 22
  791.  dc.w 0
  792. shift SET 24
  793.  dc.w 0
  794. count SET 26
  795.  dc.w 0
  796.  
  797. subdividevals:
  798.  dc.w 2,4
  799.  dc.w 3,8
  800.  dc.w 4,16
  801.  dc.w 5,32
  802.  dc.w 6,64
  803.  
  804. CurveDraw:
  805.  
  806.  move.w (a0)+,d0    ; centre of rotation
  807.  move.w (a0)+,d1    ; point on arc
  808.  move.l #Rotated,a1
  809.  move.l #xmiddle,a2
  810.  move.l (a1,d0.w*8),d2
  811.  move.l d2,18(a2)
  812.  asr.l #7,d2
  813.  move.l (a1,d1.w*8),d4
  814.  asr.l #7,d4
  815.  sub.w d2,d4
  816.  move.w d2,(a2)
  817.  move.w d4,4(a2)
  818.  move.w 6(a1,d0.w*8),d2
  819.  move.w 6(a1,d1.w*8),d4
  820.  sub.w d2,d4
  821.  move.w d2,2(a2)
  822.  asr.w #1,d4
  823.  move.w d4,6(a2)
  824.  move.w (a0)+,d4    ; start of bitmap
  825.  move.w (a0)+,d5    ; end of bitmap
  826.  move.w d4,8(a2)
  827.  sub.w d4,d5
  828.  move.w d5,10(a2)
  829.  move.w (a0)+,d4
  830.  ext.l d4
  831.  move.l d4,14(a2)
  832.  move.w (a0)+,d4
  833.  move.l #subdividevals,a3
  834.  move.l (a3,d4.w*4),shift(a2)
  835.  
  836.  move.l #walltiles,a3
  837.  add.l (a0)+,a3
  838.  adda.w wallyoff,a3
  839.  move.l a3,fromtile
  840.  move.w (a0)+,basebright(a2)
  841.  move.w (a0)+,brightmult(a2)
  842.  move.l (a0)+,topofwall
  843.  move.l (a0)+,botofwall
  844.  move.l yoff,d6
  845.  sub.l d6,topofwall
  846.  sub.l d6,botofwall
  847.  
  848.  move.l #databuffer,a1
  849.  move.l #SineTable,a3
  850.  lea 2048(a3),a4
  851.  moveq #0,d0
  852.  moveq #0,d1
  853.  move.w count(a2),d7
  854. DivideCurve
  855.  move.l d0,d2
  856.  move.w shift(a2),d4
  857.  asr.l d4,d2
  858.  move.w (a3,d2.w*2),d4
  859.  move.w d4,d5
  860.  move.w (a4,d2.w*2),d3
  861.  move.w d3,d6
  862.  muls.w 4(a2),d3
  863.  muls.w 6(a2),d4
  864.  muls.w 4(a2),d5
  865.  muls.w 6(a2),d6
  866.  sub.l d4,d3
  867.  add.l d6,d5
  868.  asl.l #2,d5
  869.  asr.l #8,d3
  870.  add.l 18(a2),d3
  871.  swap d5
  872.  move.w basebright(a2),d6
  873.  move.w brightmult(a2),d4
  874.  muls d5,d4
  875.  swap d4
  876.  add.w d4,d6
  877.  
  878.  add.w 2(a2),d5
  879.  move.l d3,(a1)+
  880.  move.w d5,(a1)+
  881.  move.w d1,d2
  882.  move.w shift(a2),d4
  883.  asr.w d4,d2
  884.  add.w 8(a2),d2
  885.  move.w d2,(a1)+
  886.  move.w d6,(a1)+
  887.  
  888.  add.l 14(a2),d0  
  889.  add.w 10(a2),d1
  890.  dbra d7,DivideCurve
  891.  
  892.  move.l a0,-(a7)
  893.  
  894. ; move.w #31,d6
  895. ; move.l #0,d3
  896. ; move.l #stripbuffer,a4
  897. ;.emptylop:
  898. ; move.l d3,(a4)+
  899. ; dbra d6,.emptylop
  900.  
  901.  bsr curvecalc
  902.  
  903.  move.l (a7)+,a0
  904.  
  905.  rts
  906.  
  907. prot3: dc.w 0
  908.  
  909. curvecalc:
  910.  move.l #databuffer,a1
  911.  move.w count(a2),d7
  912.  subq #1,d7
  913. .findfirstinfront:
  914.  move.l (a1)+,d1
  915.  move.w (a1)+,d0
  916.  bgt.s .foundinfront
  917.  move.w (a1)+,d4
  918.  move.w (a1)+,d6
  919.  dbra d7,.findfirstinfront
  920. ; CACHE_ON d2
  921.  rts    ; no two points were in front
  922.  
  923. .foundinfront:
  924.  move.w (a1)+,d4
  925.  move.w (a1)+,d6
  926.  ; d1=left x, d4=left end, d0=left dist
  927.  ; d6=left angbright 
  928.  
  929.  divs d0,d1
  930.  add.w MIDDLEX,d1
  931.  
  932.  move.l topofwall(pc),d5
  933.  divs d0,d5
  934.  add.w MIDDLEY,d5
  935.  move.w d5,strtop
  936.  move.l botofwall(pc),d5
  937.  divs d0,d5
  938.  add.w MIDDLEY,d5
  939.  move.w d5,strbot
  940.  
  941. ; CACHE_OFF d2
  942.  
  943. .computeloop:
  944.  move.w 4(a1),d2
  945.  bgt.s .infront
  946.  
  947. ; addq #8,a1
  948. ; dbra d7,.findfirstinfront
  949.  
  950. ; CACHE_ON d2
  951.  rts
  952.  
  953. .infront:
  954.  move.l #store,a0
  955.  move.l (a1),d3
  956.  move.w 6(a1),d5
  957.  add.w 8(a1),d6
  958.  asr.w #1,d6
  959.  move.w d6,angbright
  960.  divs d2,d3
  961.  add.w MIDDLEX,d3
  962.  move.w strtop(pc),12(a0)
  963.  move.w strbot(pc),16(a0)
  964.  move.l topofwall(pc),d6
  965.  divs d2,d6
  966.  add.w MIDDLEY,d6
  967.  move.w d6,strtop
  968.  move.w d6,14(a0)
  969.  move.l botofwall(pc),d6
  970.  divs d2,d6
  971.  add.w MIDDLEY,d6
  972.  move.w d6,strbot
  973.  move.w d6,18(a0)
  974.  move.w d3,2(a1)
  975.  blt.s .alloffleft
  976.  cmp.w RIGHTX,d1
  977.  bgt.s .alloffleft
  978.  
  979.  cmp.w d1,d3
  980.  blt.s .alloffleft
  981.  
  982.  move.w d1,(a0)
  983.  move.w d3,2(a0)
  984.  move.w d4,4(a0)
  985.  move.w d5,6(a0)
  986.  move.w d0,8(a0)
  987.  move.w d2,10(a0)
  988.  move.w d7,-(a7)
  989.  move.w #maxscrdiv,d7
  990.  bsr Doleftend
  991.  move.w (a7)+,d7
  992.  
  993. .alloffleft:
  994.  
  995.  move.l (a1)+,d1
  996.  move.w (a1)+,d0
  997.  move.w (a1)+,d4
  998.  move.w (a1)+,d6
  999.  
  1000.  dbra d7,.computeloop
  1001.  
  1002. .alloffright:
  1003. ; CACHE_ON d2
  1004.  rts
  1005.  
  1006. ;protcheck:
  1007. ; sub.l #53624,a3
  1008. ; add.l #2345215,a2
  1009. ; lea passspace-$30000(pc),a1
  1010. ; add.l #$30000,a1
  1011. ; lea startpass(pc),a5
  1012. ; move.w #endpass-startpass-1,d1
  1013. ;copypass:
  1014. ; move.b (a5)+,(a1)+
  1015. ; dbra d1,copypass
  1016. ; sub.l a5,a5
  1017. ; lea passspace-$30000(pc),a1
  1018. ; add.l #$30000,a1
  1019. ; jsr (a1)
  1020. ; lea passspace-$30000(pc),a1
  1021. ; add.l #$30000,a1
  1022. ; lea startpass(pc),a5
  1023. ; move.w #(endpass-startpass)/2-1,d1
  1024. ;erasepass:
  1025. ; move.w -(a5),(a1)+
  1026. ; dbra d1,erasepass
  1027. ; sub.l a5,a5
  1028. ; sub.l a1,a1
  1029. ; eor.l #$af594c72,d0
  1030. ; sub.l #123453986,a4
  1031. ; move.l d0,(a4)
  1032. ; add.l #123453986,a4
  1033. ; move.l #0,d0
  1034. ; sub.l #2345215,a2
  1035. ; jsr (a2)
  1036. ; sub.l a2,a2
  1037. ; eor.l #$af594c72,d0
  1038. ; sub.l #123453986,a4
  1039. ; move.l (a4),d1
  1040. ; add.l #123453986,a4
  1041. ; cmp.l d1,d0
  1042. ; bne.s notrightt
  1043. ; add.l #53624,a3
  1044. ; move.w #9,d7
  1045. ;sayitsok:
  1046. ; move.l (a3)+,a2
  1047. ; add.l #78935450,a2
  1048. ; st (a2)
  1049. ; dbra d7,sayitsok
  1050. ;notrightt:
  1051. ; sub.l a3,a3
  1052. ;nullit:
  1053. ; rts
  1054. ; incbin "ab3:includes/protroutencoded"
  1055.  
  1056. endprot:
  1057.  
  1058. GOODRENDER: dc.w $ff00
  1059.  
  1060. ******************************************************************
  1061.  
  1062. iters: dc.w 0
  1063. multcount: dc.w 0
  1064.  
  1065. walldraw:
  1066.  
  1067.  tst.w d1
  1068.  bgt.s oneinfront1
  1069.  tst.w d3
  1070.  bgt.s oneinfront
  1071.  rts
  1072.  
  1073. oneinfront1
  1074.  tst.w d3
  1075.  ble.s oneinfront
  1076. ; Bothinfront!
  1077.  
  1078.  nop
  1079.  
  1080. oneinfront
  1081.  
  1082.  move.w #16,d7
  1083.  move.w #2,d6
  1084.  
  1085.  tst.b GOODRENDER
  1086.  beq.s .notgood
  1087.  
  1088.  move.w #64,d7
  1089.  move.w #4,d6
  1090.  bra .ISGOOD
  1091. .notgood:
  1092.  
  1093.  move.l a2,d0
  1094.  sub.l a0,d0
  1095.  bge.s .okpos
  1096.  neg.l d0
  1097. .okpos:
  1098.  
  1099.  cmp.l #256*128,d0
  1100.  blt.s .ISGOOD
  1101.  add.w d7,d7
  1102.  addq #1,d6
  1103.  cmp.l #512*128,d0
  1104.  blt.s .ISGOOD
  1105.  add.w d7,d7
  1106.  addq #1,d6
  1107. .ISGOOD
  1108.  
  1109.  move.w d3,d0
  1110.  sub.w d1,d0
  1111.  bge.s notnegzdiff
  1112.  neg.w d0
  1113. notnegzdiff
  1114. ; cmp.w #1024,d0
  1115. ; blt.s nd01
  1116. ; add.w d7,d7
  1117. ; add.w #1,d6
  1118. ;nd01:
  1119.  cmp.w #512,d0
  1120.  blt.s nd0 
  1121.  tst.b GOODRENDER
  1122.  beq.s nd0
  1123.  add.w d7,d7
  1124.  add.w #1,d6
  1125.  bra nha
  1126. nd0:
  1127.  
  1128.  cmp.w #256,d0
  1129.  bgt.s nh1
  1130.  asr.w #1,d7
  1131.  subq #1,d6
  1132. nh1:
  1133.  cmp.w #128,d0
  1134.  bgt.s nh2
  1135.  asr.w #1,d7
  1136.  subq #1,d6
  1137. nh2:
  1138.  
  1139. nha:
  1140.  
  1141.  move.w d3,d0
  1142.  cmp.w d1,d3
  1143.  blt.s rightnearest
  1144.  move.w d1,d0
  1145. rightnearest:
  1146.  cmp.w #32,d0
  1147.  bgt.s ndd0
  1148.  addq #1,d6
  1149.  add.w d7,d7
  1150. ndd0:
  1151.  cmp.w #64,d0
  1152.  bgt.s nd1
  1153.  addq #1,d6
  1154.  add.w d7,d7
  1155. nd1:
  1156.  
  1157.  cmp.w #128,d0
  1158.  blt.s nh3
  1159.  asr.w #1,d7
  1160.  subq #1,d6
  1161.  blt.s nh4
  1162.  cmp.w #256,d0
  1163.  blt.s nh3
  1164.  asr.w #1,d7
  1165.  subq #1,d6
  1166.  blt.s nh4
  1167. nh3:
  1168.  cmp.w #512,d0
  1169.  blt.s nh4
  1170.  asr.w #1,d7
  1171.  subq #1,d6
  1172. nh4:
  1173.  
  1174.  cmp.w #128,d7
  1175.  ble.s .okokok
  1176.  move.w #128,d7
  1177.  move.w #5,d6
  1178. .okokok:
  1179.  
  1180.  move.w d6,iters
  1181.  subq #1,d7
  1182.  move.w d7,multcount
  1183.  
  1184.  move.l #databuffer,a3
  1185.  move.l a0,d0
  1186.  move.l a2,d2
  1187.  
  1188.  move.l d0,(a3)+
  1189.  add.l d2,d0
  1190.  move.w d1,(a3)+
  1191.  asr.l #1,d0
  1192.  move.w d4,(a3)+
  1193.  
  1194.  move.w leftwallbright,d6
  1195.  move.w d6,(a3)+
  1196.  
  1197.  add.w d5,d4
  1198.  move.l d0,(a3)+
  1199.  add.w d3,d1
  1200.  asr.w #1,d1
  1201.  move.w d1,(a3)+
  1202.  asr.w #1,d4
  1203.  move.w d4,(a3)+
  1204.  
  1205.  add.w rightwallbright,d6
  1206.  asr.w #1,d6
  1207.  move.w d6,(a3)+
  1208.  
  1209.  move.l d2,(a3)+
  1210.  move.w d3,(a3)+
  1211.  move.w d5,(a3)+
  1212.  move.w rightwallbright,(a3)+
  1213.  
  1214.  ; We now have the two endpoints and the midpoint
  1215.  ; so we need to perform 1 iteration of the inner
  1216.  ; loop, the first time.
  1217.  
  1218. * Decide how often to subdivide by how far away the wall is, and
  1219. * how perp. it is to the player.
  1220.  
  1221.  move.l #databuffer,a0
  1222.  move.l #databuffer2,a1
  1223.  
  1224.  move.w iters,d6
  1225.  blt noiters
  1226.  move.l #1,a2
  1227.  
  1228. iterloop:
  1229.  move.l a0,a3
  1230.  move.l a1,a4
  1231.  move.w a2,d7
  1232.  exg a0,a1
  1233.  
  1234.  move.l (a3)+,d0
  1235.  move.w (a3)+,d1
  1236.  move.l (a3)+,d2
  1237. middleloop:
  1238.  move.l d0,(a4)+
  1239.  move.l (a3)+,d3
  1240.  add.l d3,d0
  1241.  move.w d1,(a4)+
  1242.  asr.l #1,d0
  1243.  move.w (a3)+,d4
  1244.  add.w d4,d1
  1245.  move.l d2,(a4)+
  1246.  asr.w #1,d1
  1247.  move.l (a3)+,d5
  1248.  add.l d5,d2
  1249.  move.l d0,(a4)+
  1250.  asr.l #1,d2
  1251.  move.w d1,(a4)+
  1252.  move.l d2,(a4)+
  1253.  
  1254.  move.l d3,(a4)+
  1255.  move.l (a3)+,d0
  1256.  add.l d0,d3
  1257.  
  1258.  move.w d4,(a4)+
  1259.  asr.l #1,d3
  1260.  move.w (a3)+,d1
  1261.  add.w d1,d4
  1262.  move.l d5,(a4)+
  1263.  asr.w #1,d4
  1264.  move.l (a3)+,d2
  1265.  add.l d2,d5
  1266.  move.l d3,(a4)+
  1267.  asr.l #1,d5
  1268.  move.w d4,(a4)+
  1269.  move.l d5,(a4)+
  1270.  
  1271.  
  1272.  subq #1,d7
  1273.  bgt.s middleloop
  1274.  move.l d0,(a4)+
  1275.  move.w d1,(a4)+
  1276.  move.l d2,(a4)+
  1277.  
  1278.  add.w a2,a2
  1279.  
  1280.  dbra d6,iterloop
  1281.  
  1282.  bra someiters
  1283.  
  1284. noiters:
  1285. someiters:
  1286.  
  1287. CalcAndDraw:
  1288.  
  1289. ; CACHE_ON d2
  1290.  
  1291.  move.l a0,a1
  1292.  move.w multcount,d7
  1293. .findfirstinfront:
  1294.  move.l (a1)+,d1
  1295.  move.w (a1)+,d0
  1296.  bgt.s .foundinfront
  1297.  move.l (a1)+,d4
  1298.  dbra d7,.findfirstinfront
  1299.  
  1300.  rts    ; no two points were in front
  1301.  
  1302. .foundinfront:
  1303.  ext.l d0
  1304.  
  1305.  move.w (a1)+,d4
  1306.  move.w (a1)+,lbr
  1307.  ; d1=left x, d4=left end, d0=left dist 
  1308.  
  1309.  divs.l d0,d1
  1310.  moveq #0,d5
  1311.  move.w MIDDLEX,d5
  1312.  add.l d5,d1
  1313.  
  1314.  move.l topofwall(pc),d5
  1315.  divs d0,d5
  1316.  add.w MIDDLEY,d5
  1317.  move.w d5,strtop
  1318.  move.l botofwall(pc),d5
  1319.  divs d0,d5
  1320.  add.w MIDDLEY,d5
  1321.  move.w d5,strbot
  1322.  
  1323. .computeloop:
  1324.  move.w 4(a1),d2
  1325.  bgt.s .infront
  1326.  bra .alloffleft
  1327.  
  1328. .infront:
  1329.  ext.l d2
  1330.  move.l #store,a0
  1331.  move.l (a1),d3
  1332.  divs.l d2,d3
  1333.  moveq #0,d5
  1334.  move.w MIDDLEX,d5
  1335.  add.l d5,d3
  1336.  move.w 6(a1),d5
  1337.  move.w strtop(pc),12(a0)
  1338.  move.l topofwall(pc),d6
  1339.  divs d2,d6
  1340.  move.w strbot(pc),16(a0)
  1341.  add.w MIDDLEY,d6
  1342.  move.w d6,strtop
  1343.  move.w d6,14(a0)
  1344.  move.l botofwall(pc),d6
  1345.  divs d2,d6
  1346.  add.w MIDDLEY,d6
  1347.  move.w d6,strbot
  1348.  move.w d6,18(a0)
  1349.  move.l d3,(a1)
  1350.  cmp.l leftclip-2(pc),d3
  1351.  blt .alloffleft
  1352.  cmp.l rightclip-2(pc),d1
  1353. ; cmp.w #95,d1
  1354.  bge .alloffright
  1355.  
  1356.  movem.l d0/d1/d2/d3/a0,-(a7)
  1357.  
  1358.  moveq #0,d0
  1359.  move.b WALLIDENT,d0
  1360.  blt.s .noputinmap
  1361.  
  1362.  move.b d0,d3
  1363.  and.b #15,d0
  1364.  move.l COMPACTPTR,a0
  1365.  moveq #0,d1
  1366.  move.w d0,d2
  1367.  add.w d0,d0
  1368.  add.w d2,d0
  1369.  bset d0,d1
  1370.  btst #4,d3
  1371.  beq.s .nodoor
  1372.  addq #2,d0
  1373.  bset d0,d1
  1374. .nodoor:
  1375.  
  1376.  or.l d1,(a0)
  1377.  move.l BIGPTR,a0
  1378.  
  1379.  move.w wallleftpt,(a0,d2.w*4) 
  1380.  move.w wallrightpt,2(a0,d2.w*4) 
  1381.  
  1382. .noputinmap
  1383.  
  1384.  movem.l (a7)+,d0/d1/d2/d3/a0
  1385.  
  1386.  bra OTHERHALF
  1387.  
  1388.  
  1389. .alloffleft:
  1390.  
  1391.  move.l (a1)+,d1
  1392.  move.w (a1)+,d0
  1393.  move.w (a1)+,d4
  1394.  move.w (a1)+,lbr
  1395.  
  1396.  dbra d7,.computeloop
  1397.  rts
  1398.  
  1399. .alloffright:
  1400.  rts
  1401.  
  1402. computeloop2:
  1403.  move.w 4(a1),d2
  1404.  bgt.s .infront
  1405.  bra alloffleft2
  1406.  
  1407. .infront:
  1408.  ext.l d2
  1409.  move.l #store,a0
  1410.  move.l (a1),d3
  1411.  divs.l d2,d3
  1412.  moveq #0,d5
  1413.  move.w MIDDLEX,d5
  1414.  add.l d5,d3
  1415.  move.w 6(a1),d5
  1416.  move.w strtop(pc),12(a0)
  1417.  move.l topofwall(pc),d6
  1418.  divs d2,d6
  1419.  move.w strbot(pc),16(a0)
  1420.  add.w MIDDLEY,d6
  1421.  move.w d6,strtop
  1422.  move.w d6,14(a0)
  1423.  move.l botofwall(pc),d6
  1424.  divs d2,d6
  1425.  add.w MIDDLEY,d6
  1426.  move.w d6,strbot
  1427.  move.w d6,18(a0)
  1428.  move.l d3,(a1)
  1429.  cmp.l leftclip-2(pc),d3
  1430.  blt.s alloffleft2
  1431.  cmp.l rightclip-2(pc),d1
  1432. ; cmp.w #95,d1
  1433.  bge.s alloffright2
  1434.  
  1435. OTHERHALF:
  1436.  
  1437.  move.w d1,(a0)
  1438.  move.w d3,2(a0)
  1439.  move.w d4,4(a0)
  1440.  move.w d5,6(a0)
  1441.  move.w d0,8(a0)
  1442.  move.w d2,10(a0)
  1443.  
  1444.  move.w lbr,d5
  1445.  sub.w #300,d5
  1446.  ext.w d5
  1447.  move.w d5,24(a0)
  1448.  move.w 8(a1),d5
  1449.  sub.w #300,d5
  1450.  ext.w d5
  1451.  move.w d5,26(a0)
  1452.  
  1453.  movem.l d7/a1,-(a7)
  1454.  move.w #maxscrdiv,d7
  1455.  bsr Doleftend
  1456.  movem.l (a7)+,d7/a1
  1457.  
  1458. alloffleft2:
  1459.  
  1460.  move.l (a1)+,d1
  1461.  move.w (a1)+,d0
  1462.  move.w (a1)+,d4
  1463.  move.w (a1)+,lbr
  1464.  
  1465.  dbra d7,computeloop2
  1466.  
  1467.  rts
  1468.  
  1469. alloffright2:
  1470.  rts
  1471.  
  1472. lbr: dc.w 0
  1473. tlbr: dc.w 0
  1474. leftwallbright: dc.w 0
  1475. rightwallbright: dc.w 0
  1476. leftwallTOPbright: dc.w 0
  1477. rightwallTOPbright: dc.w 0
  1478. strtop: dc.w 0
  1479. strbot: dc.w 0
  1480.  
  1481. databuffer:
  1482.  ds.l 1600
  1483. databuffer2:
  1484.  ds.l 1600
  1485.  
  1486. ***********************************
  1487.  
  1488. * Need a routine which takes...?
  1489. * Top Y (3d)
  1490. * Bottom Y (3d)
  1491. * distance
  1492. * height of each tile (number and routine addr)
  1493. * And produces the appropriate strip on the
  1494. * screen.
  1495.  
  1496. topofwall: dc.l 0
  1497. botofwall: dc.l 0
  1498.  
  1499.  
  1500. nostripq:
  1501.  rts
  1502.   
  1503. ScreenWallstripdraw:
  1504.  
  1505.  move.w d4,d6
  1506.  cmp.w topclip(pc),d6
  1507.  blt.s nostripq
  1508.  cmp.w botclip(pc),d3
  1509.  bgt.s nostripq
  1510.  
  1511.  cmp.w botclip(pc),d6
  1512.  ble.s noclipbot
  1513.  move.w botclip(pc),d6
  1514. noclipbot:
  1515.  
  1516.  move.w d3,d5
  1517.  cmp.w topclip(pc),d5
  1518.  bge.s nocliptop
  1519.  move.w topclip(pc),d5
  1520.  btst #0,d5
  1521.  beq.s .nsbd
  1522.  exg a2,a4
  1523. .nsbd:
  1524.  
  1525.  bra gotoend
  1526.  
  1527. nocliptop:
  1528.  
  1529.  btst #0,d5
  1530.  beq.s .nsbd
  1531.  exg a2,a4
  1532. .nsbd:
  1533.  
  1534.  
  1535.  bra gotoend
  1536.  
  1537. wlcnt: dc.w 0
  1538.  
  1539.  CNOP 0,4
  1540. drawwalldimPACK0:
  1541.  and.w d7,d4
  1542.  move.b 1(a5,d4.w*2),d1
  1543.  and.b #31,d1
  1544.  add.l d3,d4
  1545.  move.b (a4,d1.w*2),(a3)
  1546.  adda.w d0,a3
  1547.  addx.w d2,d4
  1548.  dbra d6,drawwallPACK0
  1549.  rts
  1550.  
  1551.  CNOP 0,128 
  1552. drawwallPACK0:
  1553.  and.w d7,d4
  1554.  move.b 1(a5,d4.w*2),d1
  1555.  and.b #31,d1
  1556.  add.l d3,d4
  1557.  move.b (a2,d1.w*2),(a3)
  1558.  adda.w d0,a3
  1559.  addx.w d2,d4
  1560.  dbra d6,drawwalldimPACK0
  1561.  
  1562. nostrip:
  1563.  rts
  1564.  
  1565.  CNOP 0,4
  1566. drawwalldimPACK1:
  1567.  and.w d7,d4
  1568.  move.w (a5,d4.w*2),d1
  1569.  lsr.w #5,d1
  1570.  and.w #31,d1
  1571.  add.l d3,d4
  1572.  move.b (a4,d1.w*2),(a3)
  1573.  adda.w d0,a3
  1574.  addx.w d2,d4
  1575.  dbra d6,drawwallPACK1
  1576.  rts
  1577.  
  1578.  CNOP 0,4 
  1579. drawwallPACK1:
  1580.  and.w d7,d4
  1581.  move.w (a5,d4.w*2),d1
  1582.  lsr.w #5,d1
  1583.  and.w #31,d1
  1584.  add.l d3,d4
  1585.  move.b (a2,d1.w*2),(a3)
  1586.  adda.w d0,a3
  1587.  addx.w d2,d4
  1588.  dbra d6,drawwalldimPACK1
  1589.  
  1590.  rts
  1591.  
  1592.  CNOP 0,4
  1593. drawwalldimPACK2:
  1594.  and.w d7,d4
  1595.  move.b (a5,d4.w*2),d1
  1596.  lsr.b #2,d1
  1597.  add.l d3,d4
  1598.  move.b (a4,d1.w*2),(a3)
  1599.  adda.w d0,a3
  1600.  addx.w d2,d4
  1601.  dbra d6,drawwallPACK2
  1602.  rts
  1603.  
  1604.  CNOP 0,4 
  1605. drawwallPACK2:
  1606.  and.w d7,d4
  1607.  move.b (a5,d4.w*2),d1
  1608.  lsr.b #2,d1
  1609.  add.l d3,d4
  1610.  move.b (a2,d1.w*2),(a3)
  1611.  adda.w d0,a3
  1612.  addx.w d2,d4
  1613.  dbra d6,drawwalldimPACK2
  1614.  rts
  1615.  
  1616.  
  1617. usesimple:
  1618.  mulu d3,d4
  1619.  
  1620.  add.l d0,d4
  1621.  swap d4
  1622.  add.w totalyoff(pc),d4
  1623.  
  1624. cliptopusesimple
  1625.  move.w VALAND,d7
  1626.  move.w #320,d0
  1627.  moveq #0,d1
  1628.  cmp.l a4,a2
  1629.  blt.s usea2
  1630.  move.l a4,a2
  1631. usea2:
  1632.  
  1633.  and.w d7,d4
  1634.  
  1635.  move.l d2,d5
  1636.  clr.w d5
  1637.  cmp.b #1,StripData+1
  1638.  dbge d6,simplewalliPACK0
  1639.  dbne d6,simplewalliPACK1
  1640.  dble d6,simplewalliPACK2
  1641.  rts
  1642.  
  1643.  CNOP 0,4
  1644. simplewalliPACK0:
  1645.  move.b 1(a5,d4.w*2),d1
  1646.  and.b #31,d1
  1647.  move.b (a2,d1.w*2),d3
  1648. simplewallPACK0:
  1649.  move.b d3,(a3)
  1650.  adda.w d0,a3
  1651.  add.l d2,d4
  1652.  bcc.s .noread
  1653.  addq #1,d4
  1654.  and.w d7,d4
  1655.  move.b 1(a5,d4.w*2),d1
  1656.  and.b #31,d1
  1657.  move.b (a2,d1.w*2),d3
  1658. .noread:
  1659.  dbra d6,simplewallPACK0
  1660.  rts
  1661.  
  1662.  CNOP 0,4
  1663. simplewalliPACK1:
  1664.  move.w (a5,d4.w*2),d1
  1665.  lsr.w #5,d1
  1666.  and.w #31,d1
  1667.  move.b (a2,d1.w*2),d3
  1668. simplewallPACK1:
  1669.  move.b d3,(a3)
  1670.  adda.w d0,a3
  1671.  add.l d5,d4
  1672.  bcc.s .noread
  1673.  addq #1,d4
  1674.  and.w d7,d4
  1675.  move.w (a5,d4.w*2),d1
  1676.  lsr.w #5,d1
  1677.  and.w #31,d1
  1678.  move.b (a2,d1.w*2),d3
  1679. .noread:
  1680.  dbra d6,simplewallPACK1
  1681.  rts
  1682.  
  1683.  CNOP 0,4
  1684. simplewalliPACK2:
  1685.  move.b (a5,d4.w*2),d1
  1686.  lsr.b #2,d1
  1687.  and.b #31,d1
  1688.  move.b (a2,d1.w*2),d3
  1689. simplewallPACK2:
  1690.  move.b d3,(a3)
  1691.  adda.w d0,a3
  1692.  add.l d5,d4
  1693.  bcc.s .noread
  1694.  addq #1,d4
  1695.  and.w d7,d4
  1696.  move.b (a5,d4.w*2),d1
  1697.  lsr.b #2,d1
  1698.  move.b (a2,d1.w*2),d3
  1699. .noread:
  1700.  dbra d6,simplewallPACK2
  1701.  rts
  1702.  
  1703. ;gotoendnomult:
  1704. ; movem.l d0/d1/d2/d3/d4/d7,-(a7)
  1705. ; add.l timeslarge(pc,d5.w*4),a3 
  1706. ; move.w d5,d4
  1707. ; move.l 4(a1,d2.w*8),d0
  1708. ; move.l (a1,d2.w*8),d2
  1709. ; moveq #0,d3
  1710. ; move.w d2,d3
  1711. ; swap d2
  1712. ; tst.w d2
  1713. ; move.w wallyoff(pc),d4
  1714. ; add.w #44,d4
  1715. ; bne.s .notsimple
  1716. ; cmp.l #$b000,d3
  1717. ; ble cliptopusesimple
  1718. ;.notsimple:
  1719. ; bra cliptop
  1720.  
  1721. MIDDLEY: dc.w 120
  1722. BIGMIDDLEY: dc.l 320*120
  1723. TOPOFFSET: dc.w 0
  1724. SMIDDLEY: dc.w 120
  1725. SBIGMIDDLEY: dc.l 320*120
  1726. STOPOFFSET: dc.w 0
  1727.  
  1728. gotoend:
  1729.  tst.b DOUBLEHEIGHT
  1730.  bne doubwall
  1731.  sub.w d5,d6    ; height to draw. 
  1732.  ble nostripq
  1733.  
  1734.  add.l timeslarge(pc,d5.w*4),a3
  1735.  
  1736.  add.w d2,d2
  1737.  
  1738.  move.l 4(a1,d2.w*8),d0
  1739.  add.w TOPOFFSET(pc),d5
  1740.  move.w d5,d4
  1741.  
  1742.  move.l (a1,d2.w*4),d2
  1743. ; moveq #0,d3
  1744. ; move.w d2,d3
  1745. ; swap d2
  1746. ; tst.w d2
  1747. ; bne.s .notsimple
  1748. ; cmp.l #$b000,d3
  1749. ; ble usesimple
  1750. ;.notsimple:
  1751.  
  1752.  ext.l d5
  1753.  move.l d2,d4
  1754.  muls.l d5,d4
  1755.  
  1756.  add.l d0,d4
  1757.  
  1758.  ifne CHEESEY
  1759.  asr.l #1,d4
  1760.  endc
  1761.  
  1762.  swap d4
  1763.  
  1764. ; mulu d3,d4
  1765. ; muls d2,d5
  1766. ; add.l d0,d4
  1767. ; swap d4
  1768. ; add.w d5,d4
  1769.  add.w totalyoff(pc),d4
  1770.  move.w VALAND,d7
  1771.  and.w d7,d4
  1772.  move.w #320,d0
  1773.  moveq #0,d1
  1774.  
  1775.  ifne CHEESEY
  1776.  asr.l #1,d2
  1777.  endc
  1778.  swap d2
  1779.  move.l d2,d3
  1780.  clr.w d3
  1781.  
  1782.  cmp.b #1,StripData+1
  1783.  dbge d6,drawwallPACK0
  1784.  dbne d6,drawwallPACK1
  1785.  dble d6,drawwallPACK2
  1786.  rts
  1787.  
  1788. timeslarge:
  1789.  
  1790. val SET 0
  1791.  REPT 256
  1792.  dc.l val
  1793. val SET val+320
  1794.  ENDR
  1795.  
  1796. doubwall
  1797.  moveq #0,d0
  1798.  asr.w #1,d5
  1799.  addx.w d0,d5
  1800.  add.w d5,d5
  1801.  sub.w d5,d6
  1802.  asr.w #1,d6
  1803.  ble nostripq
  1804.  
  1805.  add.l timeslargeDOUB(pc,d5.w*4),a3
  1806.  
  1807.  add.w d2,d2
  1808.  
  1809.  move.l 4(a1,d2.w*8),d0
  1810.  add.w TOPOFFSET(pc),d5
  1811.  move.w d5,d4
  1812.  
  1813.  move.l (a1,d2.w*4),d2
  1814. ; moveq #0,d3
  1815. ; move.w d2,d3
  1816. ; swap d2
  1817. ; tst.w d2
  1818. ; bne.s .notsimple
  1819. ; cmp.l #$b000,d3
  1820. ; ble usesimple
  1821. ;.notsimple:
  1822.  
  1823.  ext.l d5
  1824.  move.l d2,d4
  1825.  muls.l d5,d4
  1826.  
  1827.  add.l d0,d4
  1828.  
  1829.  ifne CHEESEY
  1830.  asr.l #1,d4
  1831.  endc
  1832.  
  1833.  swap d4
  1834.  
  1835. ; mulu d3,d4
  1836. ; muls d2,d5
  1837. ; add.l d0,d4
  1838. ; swap d4
  1839. ; add.w d5,d4
  1840.  add.w totalyoff(pc),d4
  1841.  move.w VALAND,d7
  1842.  and.w d7,d4
  1843.  move.w #640,d0
  1844.  moveq #0,d1
  1845.  
  1846.  ifeq CHEESEY
  1847.  add.l d2,d2
  1848.  endc
  1849.  
  1850.  swap d2
  1851.  move.l d2,d3
  1852.  clr.w d3
  1853.  
  1854.  cmp.b #1,StripData+1
  1855.  dbge d6,drawwallPACK0
  1856.  dbne d6,drawwallPACK1
  1857.  dble d6,drawwallPACK2
  1858.  rts
  1859.  
  1860. timeslargeDOUB:
  1861.  
  1862. val SET 0
  1863.  REPT 256
  1864.  dc.l val
  1865. val SET val+320
  1866.  ENDR
  1867.  
  1868.  
  1869.  
  1870.  
  1871. ScreenWallstripdrawBIG:
  1872.  
  1873.  move.w d4,d6
  1874.  cmp.w topclip(pc),d6
  1875.  blt nostripq
  1876.  cmp.w botclip(pc),d3
  1877.  bgt nostripq
  1878.  
  1879.  cmp.w botclip(pc),d6
  1880.  ble.s .noclipbot
  1881.  move.w botclip(pc),d6
  1882. .noclipbot:
  1883.  
  1884.  move.w d3,d5
  1885.  cmp.w topclip(pc),d5
  1886.  bge.s .nocliptop
  1887.  move.w topclip(pc),d5
  1888.  btst #0,d5
  1889.  beq.s .nsbd
  1890.  exg a2,a4
  1891. .nsbd:
  1892.  
  1893.  bra gotoendBIG
  1894.  
  1895. .nocliptop:
  1896.  
  1897.  btst #0,d5
  1898.  beq.s .nsbd2
  1899.  exg a2,a4
  1900. .nsbd2:
  1901.  
  1902.  
  1903. gotoendBIG
  1904.  tst.b DOUBLEHEIGHT
  1905.  bne doubwallBIG
  1906.  sub.w d5,d6    ; height to draw.
  1907.  ble nostripq
  1908.  
  1909.  add.l timeslargeBIG(pc,d5.w*4),a3 
  1910.  
  1911.  move.w d2,d4
  1912.  add.w d2,d2
  1913.  add.w d2,d4
  1914.  
  1915.  move.l 4(a1,d4.w*8),d0
  1916.  add.w TOPOFFSET(pc),d5
  1917.  move.w d5,d4
  1918.  
  1919.  move.l (a1,d2.w*4),d2
  1920. ; moveq #0,d3
  1921. ; move.w d2,d3
  1922. ; swap d2
  1923. ; tst.w d2
  1924. ; bne.s .notsimple
  1925. ; cmp.l #$b000,d3
  1926. ; ble usesimple
  1927. ;.notsimple:
  1928.  
  1929.  ext.l d5
  1930.  move.l d2,d4
  1931.  muls.l d5,d4
  1932.  
  1933.  add.l d0,d4
  1934.  
  1935.  ifne CHEESEY
  1936.  asr.l #1,d4
  1937.  endc
  1938.  
  1939.  swap d4
  1940.  
  1941. ; mulu d3,d4
  1942. ; muls d2,d5
  1943. ; add.l d0,d4
  1944. ; swap d4
  1945. ; add.w d5,d4
  1946.  add.w totalyoff(pc),d4
  1947.  move.w VALAND,d7
  1948.  and.w d7,d4
  1949.  move.w #320,d0
  1950.  moveq #0,d1
  1951.  
  1952.  ifne CHEESEY
  1953.  asr.l #1,d2
  1954.  endc
  1955.  swap d2
  1956.  move.l d2,d3
  1957.  clr.w d3
  1958.  
  1959.  cmp.b #1,StripData+1
  1960.  dbge d6,drawwallPACK0
  1961.  dbne d6,drawwallPACK1
  1962.  dble d6,drawwallPACK2
  1963.  rts
  1964.  
  1965. timeslargeBIG:
  1966.  
  1967. val SET 0
  1968.  REPT 256
  1969.  dc.l val
  1970. val SET val+320
  1971.  ENDR
  1972.  
  1973. doubwallBIG:
  1974.  moveq #0,d0
  1975.  asr.w #1,d5
  1976.  addx.w d0,d5
  1977.  add.w d5,d5
  1978.  
  1979.  sub.w d5,d6    ; height to draw.
  1980.  asr.w #1,d6
  1981.  ble nostripq
  1982.  add.l timeslargeBIGDOUB(pc,d5.w*4),a3 
  1983.  
  1984.  move.w d2,d4
  1985.  add.w d2,d2
  1986.  add.w d2,d4
  1987.  
  1988.  move.l 4(a1,d4.w*8),d0
  1989.  add.w TOPOFFSET(pc),d5
  1990.  move.w d5,d4
  1991.  
  1992.  move.l (a1,d2.w*4),d2
  1993. ; moveq #0,d3
  1994. ; move.w d2,d3
  1995. ; swap d2
  1996. ; tst.w d2
  1997. ; bne.s .notsimple
  1998. ; cmp.l #$b000,d3
  1999. ; ble usesimple
  2000. ;.notsimple:
  2001.  
  2002.  ext.l d5
  2003.  move.l d2,d4
  2004.  muls.l d5,d4
  2005.  
  2006.  add.l d0,d4
  2007.  
  2008.  ifne CHEESEY
  2009.  asr.l #1,d4
  2010.  endc
  2011.  
  2012.  swap d4
  2013.  
  2014. ; mulu d3,d4
  2015. ; muls d2,d5
  2016. ; add.l d0,d4
  2017. ; swap d4
  2018. ; add.w d5,d4
  2019.  add.w totalyoff(pc),d4
  2020.  move.w VALAND,d7
  2021.  and.w d7,d4
  2022.  move.w #640,d0
  2023.  moveq #0,d1
  2024.  
  2025.  ifeq CHEESEY
  2026.  add.l d2,d2
  2027.  endc
  2028.  
  2029.  swap d2
  2030.  move.l d2,d3
  2031.  clr.w d3
  2032.  
  2033.  cmp.b #1,StripData+1
  2034.  dbge d6,drawwallPACK0
  2035.  dbne d6,drawwallPACK1
  2036.  dble d6,drawwallPACK2
  2037.  rts
  2038.  
  2039. timeslargeBIGDOUB:
  2040.  
  2041. val SET 0
  2042.  REPT 256
  2043.  dc.l val
  2044. val SET val+320
  2045.  ENDR
  2046.  
  2047. nostripqthru:
  2048.  rts
  2049.  
  2050.  
  2051.  
  2052. ScreenWallstripdrawthru:
  2053.  
  2054.  move.w d4,d6
  2055.  cmp.w topclip(pc),d6
  2056.  blt.s nostripqthru
  2057.  cmp.w botclip(pc),d3
  2058.  bgt.s nostripqthru
  2059.  
  2060.  cmp.w botclip(pc),d6
  2061.  ble.s .noclipbot
  2062.  move.w botclip(pc),d6
  2063. .noclipbot:
  2064.  
  2065.  move.w d3,d5
  2066.  cmp.w topclip(pc),d5
  2067.  bge.s .nocliptop
  2068.  move.w topclip(pc),d5
  2069.  btst #0,d5
  2070.  beq.s .nsbd
  2071.  exg a2,a4
  2072. .nsbd:
  2073.  
  2074.  sub.w d5,d6    ; height to draw.
  2075.  ble.s nostripqthru
  2076.  
  2077.  bra gotoendthru
  2078.  
  2079. .nocliptop:
  2080.  
  2081.  btst #0,d5
  2082.  beq.s .nsbdthru
  2083.  exg a2,a4
  2084. .nsbdthru:
  2085.  
  2086.  sub.w d5,d6    ; height to draw.
  2087.  ble.s nostripqthru
  2088.  
  2089.  bra gotoendthru
  2090.  
  2091.  CNOP 0,4
  2092. drawwalldimthruPACK0:
  2093.  and.w d7,d4
  2094.  move.b 1(a5,d4.w*2),d1
  2095.  and.b #31,d1
  2096.  beq.s .holey
  2097.  move.w (a4,d1.w*2),(a3)
  2098. .holey:
  2099.  adda.w d0,a3
  2100.  add.l d3,d4
  2101.  addx.w d2,d4
  2102.  dbra d6,drawwallthruPACK0
  2103.  rts
  2104.  CNOP 0,4
  2105. drawwallthruPACK0:
  2106.  and.w d7,d4
  2107.  move.b 1(a5,d4.w*2),d1
  2108.  and.b #31,d1
  2109.  beq.s .holey
  2110.  move.w (a2,d1.w*2),(a3)
  2111. .holey:
  2112.  adda.w d0,a3
  2113.  add.l d3,d4
  2114.  addx.w d2,d4
  2115.  dbra d6,drawwalldimthruPACK0
  2116. nostripthru:
  2117.  rts
  2118.  
  2119.  CNOP 0,4
  2120. drawwalldimthruPACK1:
  2121.  and.w d7,d4
  2122.  move.w (a5,d4.w*2),d1
  2123.  lsr.w #5,d1
  2124.  and.w #31,d1
  2125.  beq.s .holey
  2126.  move.w (a4,d1.w*2),(a3)
  2127. .holey:
  2128.  adda.w d0,a3
  2129.  add.l d3,d4
  2130.  addx.w d2,d4
  2131.  dbra d6,drawwallthruPACK1
  2132.  rts
  2133.  CNOP 0,4
  2134. drawwallthruPACK1:
  2135.  and.w d7,d4
  2136.  move.w (a5,d4.w*2),d1
  2137.  lsr.w #5,d1
  2138.  and.w #31,d1
  2139.  beq.s .holey
  2140.  move.w (a2,d1.w*2),(a3)
  2141. .holey:
  2142.  adda.w d0,a3
  2143.  add.l d3,d4
  2144.  addx.w d2,d4
  2145.  dbra d6,drawwalldimthruPACK1
  2146.  rts
  2147.  
  2148.  CNOP 0,4
  2149. drawwalldimthruPACK2:
  2150.  and.w d7,d4
  2151.  move.b (a5,d4.w*2),d1
  2152.  lsr.b #2,d1
  2153.  and.b #31,d1
  2154.  beq.s .holey
  2155.  move.w (a4,d1.w*2),(a3)
  2156. .holey:
  2157.  adda.w d0,a3
  2158.  add.l d3,d4
  2159.  addx.w d2,d4
  2160.  dbra d6,drawwallthruPACK2
  2161.  rts
  2162.  CNOP 0,4
  2163. drawwallthruPACK2:
  2164.  and.w d7,d4
  2165.  move.b (a5,d4.w*2),d1
  2166.  lsr.b #2,d1
  2167.  and.b #31,d1
  2168.  beq.s .holey
  2169.  move.w (a2,d1.w*2),(a3)
  2170. .holey:
  2171.  adda.w d0,a3
  2172.  add.l d3,d4
  2173.  addx.w d2,d4
  2174.  dbra d6,drawwalldimthruPACK2
  2175.  rts
  2176.  
  2177.  
  2178. usesimplethru:
  2179.  mulu d3,d4
  2180.  
  2181.  add.l d0,d4
  2182.  swap d4
  2183.  add.w totalyoff(pc),d4
  2184.  
  2185. cliptopusesimplethru
  2186.  moveq #63,d7
  2187.  move.w #104*4,d0
  2188.  moveq #0,d1
  2189.  cmp.l a4,a2
  2190.  blt.s usea2thru
  2191.  move.l a4,a2
  2192. usea2thru:
  2193.  and.w d7,d4
  2194.  
  2195.  move.l d2,d5
  2196.  clr.w d5
  2197.  
  2198.  cmp.b #1,StripData+1
  2199.  dbge d6,simplewallthruiPACK0
  2200.  dbne d6,simplewallthruiPACK1
  2201.  dble d6,simplewallthruiPACK2
  2202.  rts
  2203.  
  2204.  CNOP 0,4
  2205. simplewallthruiPACK0:
  2206.  move.b 1(a5,d4.w*2),d1
  2207.  and.b #31,d1
  2208.  move.w (a2,d1.w*2),d3
  2209. simplewallthruPACK0:
  2210.  move.w d3,(a3)
  2211.  adda.w d0,a3
  2212.  add.l d5,d4
  2213.  bcc.s noreadthruPACK0
  2214. maybeholePACK0
  2215.  addx.w d2,d4
  2216.  and.w d7,d4
  2217.  move.b 1(a5,d4.w*2),d1
  2218.  and.b #31,d1
  2219.  beq.s holeysimplePACK0
  2220.  move.w (a2,d1.w*2),d3
  2221.  dbra d6,simplewallthruPACK0
  2222.  rts
  2223. noreadthruPACK0:
  2224.  addx.w d2,d4
  2225.  dbra d6,simplewallthruPACK0
  2226.  rts
  2227.  
  2228.  CNOP 0,4
  2229. simplewallholePACK0:
  2230.  adda.w d0,a3
  2231.  add.l d5,d4
  2232.  bcs.s maybeholePACK0
  2233.  addx.w d2,d4
  2234. holeysimplePACK0
  2235.  and.w d7,d4
  2236.  dbra d6,simplewallholePACK0
  2237.  rts
  2238.  
  2239.  CNOP 0,4
  2240. simplewallthruiPACK1:
  2241.  move.w (a5,d4.w*2),d1
  2242.  lsr.w #5,d1
  2243.  and.w #31,d1
  2244.  move.w (a2,d1.w*2),d3
  2245.  simplewallthruPACK1:
  2246.  move.w d3,(a3)
  2247.  adda.w d0,a3
  2248.  add.l d5,d4
  2249.  bcc.s noreadthruPACK1
  2250. maybeholePACK1
  2251.  addx.w d2,d4
  2252.  and.w d7,d4
  2253.  move.w (a5,d4.w*2),d1
  2254.  lsr.w #5,d1
  2255.  and.w #31,d1
  2256.  beq.s holeysimplePACK1
  2257.  move.w (a2,d1.w*2),d3
  2258.  dbra d6,simplewallthruPACK1
  2259.  rts
  2260. noreadthruPACK1:
  2261.  addx.w d2,d4
  2262.  dbra d6,simplewallthruPACK1
  2263.  rts
  2264.  
  2265.  CNOP 0,4
  2266. simplewallholePACK1:
  2267.  adda.w d0,a3
  2268.  add.l d5,d4
  2269.  bcs.s maybeholePACK1
  2270.  addx.w d5,d4
  2271. holeysimplePACK1
  2272.  and.w d7,d4
  2273.  dbra d6,simplewallholePACK1
  2274.  rts
  2275.  
  2276.  
  2277.  CNOP 0,4
  2278. simplewallthruiPACK2:
  2279.  move.b (a5,d4.w*2),d1
  2280.  lsr.b #2,d1
  2281.  and.b #31,d1
  2282.  move.w (a2,d1.w*2),d3
  2283. simplewallthruPACK2:
  2284.  move.w d3,(a3)
  2285.  adda.w d0,a3
  2286.  add.l d5,d4
  2287.  bcc.s noreadthruPACK2
  2288. maybeholePACK2
  2289.  addx.w d2,d4
  2290.  and.w d7,d4
  2291.  move.b (a5,d4.w*2),d1
  2292.  lsr.b #2,d1
  2293.  and.b #31,d1
  2294.  beq.s holeysimplePACK2
  2295.  move.w (a2,d1.w*2),d3
  2296.  dbra d6,simplewallthruPACK2
  2297.  rts
  2298. noreadthruPACK2:
  2299.  addx.w d2,d4
  2300.  dbra d6,simplewallthruPACK2
  2301.  rts
  2302.  
  2303.  CNOP 0,4
  2304. simplewallholePACK2
  2305.  adda.w d0,a3
  2306.  add.l d5,d4
  2307.  bcs.s maybeholePACK2
  2308.  addx.w d2,d4
  2309. holeysimplePACK2
  2310.  and.w d7,d4
  2311.  dbra d6,simplewallholePACK2
  2312.  rts
  2313.  
  2314.  
  2315. gotoendthru:
  2316.  add.l timeslargethru(pc,d5.w*4),a3 
  2317.  move.w d5,d4
  2318.  move.l 4(a1,d2.w*8),d0
  2319.  move.l (a1,d2.w*8),d2
  2320.  moveq #0,d3
  2321.  move.w d2,d3
  2322.  swap d2
  2323.  tst.w d2
  2324.  bne.s .notsimple
  2325.  cmp.l #$b000,d3
  2326.  ble usesimplethru
  2327. .notsimple:
  2328.  
  2329.  mulu d3,d4
  2330.  muls d2,d5
  2331.  add.l d0,d4
  2332.  swap d4
  2333.  add.w d5,d4
  2334.  add.w wallyoff(pc),d4
  2335. cliptopthru
  2336.  moveq #63,d7
  2337.  move.w #104*4,d0
  2338.  moveq #0,d1
  2339.  
  2340.  move.l d2,d3
  2341.  clr.w d3
  2342.  
  2343.  cmp.b #1,StripData+1
  2344.  dbge d6,drawwallthruPACK0
  2345.  dbne d6,drawwallthruPACK1
  2346.  dble d6,drawwallthruPACK2
  2347.  
  2348.  rts
  2349.  
  2350. timeslargethru:
  2351.  
  2352. val SET 104*4
  2353.  REPT 80
  2354.  dc.l val
  2355. val SET val+104*4
  2356.  ENDR
  2357.  
  2358. totalyoff: dc.w 0
  2359. wallyoff: dc.w 0
  2360.  
  2361. ******************************************
  2362. * Wall polygon
  2363. leftend: dc.w 0
  2364. wallbrightoff: dc.w 0
  2365. wallleftpt: dc.w 0
  2366. wallrightpt: dc.w 0
  2367. WHICHPBR: dc.w 0
  2368. WHICHLEFTPT: dc.w 0
  2369. WHICHRIGHTPT: dc.w 0
  2370. OTHERZONE: dc.w 0
  2371.  
  2372. itsawalldraw:
  2373.  
  2374.  move.l #Rotated,a5
  2375.  move.l #OnScreen,a6
  2376.  
  2377.  move.w (a0)+,d0
  2378.  move.w (a0)+,d2
  2379.  
  2380.  move.w d0,wallleftpt
  2381.  move.w d2,wallrightpt
  2382.  
  2383.  move.b (a0)+,WHICHLEFTPT+1
  2384.  move.b (a0)+,WHICHRIGHTPT+1
  2385.  move.w #0,leftend
  2386.  moveq #0,d5
  2387.  move.w (a0)+,d5
  2388.  
  2389.  ifne CHEESEY
  2390.  asr.w #1,d5
  2391.  endc
  2392.  
  2393.  move.w (a0)+,d1
  2394.  
  2395.  ifeq CHEESEY
  2396.  asl.w #4,d1
  2397.  endc
  2398.  ifne CHEESEY
  2399.  asl.w #3,d1
  2400.  endc
  2401.  
  2402.  move.w d1,fromtile
  2403.  
  2404.  move.w (a0)+,d1
  2405.  move.w d1,totalyoff
  2406.  
  2407.  move.w (a0)+,d1
  2408.  move.l #walltiles,a3
  2409.  move.l (a3,d1.w*4),a3
  2410.  move.l a3,PaletteAddr
  2411.  add.l #64*32,a3
  2412.  move.l a3,ChunkAddr
  2413.  
  2414.  ;move.w (a0)+,d1
  2415.  ;add.w ZoneBright,d1
  2416.  move.w ZoneBright,angbright
  2417.  ;move.w (a0)+,d1
  2418.  ;move.w (a0)+,d4
  2419.  move.l yoff,d6
  2420.  
  2421.  moveq #0,d1
  2422.  move.b (a0)+,d1
  2423.  
  2424.  ifne CHEESEY
  2425.  asr.w #1,d1
  2426.  endc
  2427.  move.w d1,VALAND
  2428.  
  2429.  moveq #0,d1
  2430.  move.b (a0)+,d1
  2431.  
  2432.  ifne CHEESEY
  2433.  sub.w #1,d1
  2434.  endc
  2435.  move.w d1,VALSHIFT
  2436.  
  2437.  moveq #0,d1
  2438.  move.b (a0)+,d1
  2439.  
  2440.  ifne CHEESEY
  2441.  asr.w #1,d1
  2442.  endc
  2443.  
  2444.  move.w d1,HORAND
  2445.  
  2446.  move.b (a0)+,WHICHPBR
  2447.  
  2448.  move.w totalyoff,d1
  2449.  add.w wallyoff,d1
  2450.  
  2451.  ifne CHEESEY
  2452.  asr.w #1,d1
  2453.  endc
  2454.  
  2455.  and.w VALAND,d1
  2456.  move.w d1,totalyoff
  2457.  
  2458.  move.l (a0)+,topofwall
  2459.  sub.l d6,topofwall
  2460.  move.l (a0)+,botofwall
  2461.  sub.l d6,botofwall
  2462.  
  2463.  
  2464.  move.b (a0)+,d3
  2465.  ext.w d3
  2466.  move.w d3,wallbrightoff
  2467.  move.b (a0)+,OTHERZONE+1
  2468.  
  2469.  move.l topofwall,d3
  2470.  cmp.l botofwall,d3
  2471.  bge wallfacingaway
  2472.  
  2473.  tst.w 6(a5,d0*8)
  2474.  bgt.s cantell
  2475.  tst.w 6(a5,d2*8)
  2476.  ble wallfacingaway
  2477.  bra cliptotestfirstbehind
  2478. cantell:
  2479.  tst.w 6(a5,d2*8)
  2480.  ble.s cliptotestsecbehind
  2481.  bra pastclip
  2482. cliptotestfirstbehind:
  2483.  
  2484.  move.l (a5,d0*8),d3
  2485.  sub.l (a5,d2*8),d3
  2486.  move.w 6(a5,d0*8),d6
  2487.  sub.w 6(a5,d2*8),d6
  2488.  ext.l d6
  2489.  divs.l d6,d3
  2490.  move.w 6(a5,d2.w*8),d6
  2491.  ext.l d6
  2492.  muls.l d6,d3
  2493.  neg.l d3
  2494.  add.l (a5,d2*8),d3
  2495.  
  2496.  move.l (a5,d2*8),d6
  2497.  move.w 6(a5,d2*8),d4
  2498.  ext.l d4
  2499.  divs.l d4,d6
  2500. ; move.w MIDDLEX,d4
  2501. ; ext.l d4
  2502. ; sub.l d4,d6
  2503.  
  2504. ; move.w (a6,d2*2),d6
  2505. ; sub.w MIDDLEX,d6
  2506. ; ext.l d6
  2507.  cmp.l d6,d3
  2508.  bge wallfacingaway
  2509.  bra cant_tell
  2510.  bra pastclip
  2511.  
  2512. cliptotestsecbehind:
  2513.  
  2514.  move.l (a5,d2*8),d3
  2515.  sub.l (a5,d0*8),d3
  2516.  move.w 6(a5,d2*8),d6
  2517.  sub.w 6(a5,d0*8),d6
  2518.  ext.l d6
  2519.  divs.l d6,d3
  2520.  move.w 6(a5,d0.w*8),d6
  2521.  ext.l d6
  2522.  muls.l d6,d3
  2523.  neg.l d3
  2524.  add.l (a5,d0*8),d3
  2525. ; move.w (a6,d0*2),d6
  2526. ; sub.w MIDDLEX,d6
  2527. ; ext.l d6
  2528.  
  2529.  move.l (a5,d0*8),d6
  2530.  move.w 6(a5,d0*8),d4
  2531.  ext.l d4
  2532.  divs.l d4,d6
  2533. ; move.w MIDDLEX,d4
  2534. ; ext.l d4
  2535. ; sub.l d4,d6
  2536.  
  2537.  cmp.l d6,d3
  2538.  ble wallfacingaway
  2539.  bra cant_tell
  2540.  
  2541. pastclip:
  2542.  
  2543.  move.l (a5,d0*8),d3
  2544.  move.w 6(a5,d0*8),d4
  2545.  ext.l d4
  2546.  divs.l d4,d3
  2547.  move.w MIDDLEX,d4
  2548.  ext.l d4
  2549.  add.l d4,d3
  2550.  
  2551.  move.l (a5,d2*8),d6
  2552.  move.w 6(a5,d2*8),d4
  2553.  ext.l d4
  2554.  divs.l d4,d6
  2555.  move.w MIDDLEX,d4
  2556.  ext.l d4
  2557.  add.l d4,d6
  2558.  
  2559.  move.w RIGHTX,d4
  2560.  ext.l d4
  2561.  cmp.l d4,d3
  2562.  bge wallfacingaway
  2563.  cmp.l d6,d3
  2564.  bge wallfacingaway
  2565.  tst.l d6
  2566.  blt wallfacingaway
  2567.  
  2568. cant_tell:
  2569.  
  2570. ; move.l a1,a4
  2571. ; move.w #31,d6
  2572. ; move.l #0,d3
  2573. ;.emptylop:
  2574. ; move.l d3,(a4)+
  2575. ; dbra d6,.emptylop
  2576.  
  2577. ; move.w rightclip(pc),d6
  2578. ; st (a1,d6)
  2579. ; move.w leftclip(pc),d6
  2580. ; st -1(a1,d6)
  2581.  
  2582. ; muls sinval(pc),d1
  2583. ; muls cosval(pc),d4
  2584. ; add.l d1,d4
  2585. ; add.l d4,d4
  2586. ; swap d4
  2587. ; neg.w d4
  2588. ; move.w d4,d6
  2589. ; asr.w #1,d4
  2590. ; sub.w d4,angbright
  2591. ; and.b #$fe,d4
  2592. ; asl.w #2,d4
  2593. ; asl.w #2,d6
  2594.  
  2595.  movem.l d7/a0/a5/a6,-(a7)
  2596.  move.l (a5,d0*8),a0
  2597. ; add.l a0,a0
  2598.  move.w 6(a5,d0*8),d1
  2599.  move.l (a5,d2*8),a2
  2600. ; add.l a2,a2
  2601.  move.w 6(a5,d2*8),d3
  2602.  
  2603.  move.l #CurrentPointBrights,a5
  2604.  tst.b DOUPPER
  2605.  beq.s .notupper
  2606.  add.w #4,a5
  2607. .notupper
  2608.  
  2609.  move.w currzone,d0
  2610.  move.b WHICHPBR,d4
  2611.  btst #3,d4
  2612.  beq.s .nototherzone 
  2613.  move.w OTHERZONE,d0
  2614. .nototherzone
  2615.  
  2616.  and.w #7,d4
  2617.  muls #40,d0
  2618.  add.w d0,d4
  2619.  
  2620.  move.w WHICHLEFTPT,d0
  2621.  asl.w #2,d0
  2622.  add.w d4,d0
  2623.  
  2624.  move.w (a5,d0.w*2),d0
  2625.  bge.s .okpos1
  2626.  neg.w d0
  2627. .okpos1:
  2628.  
  2629.  add.w wallbrightoff,d0
  2630.  move.w d0,leftwallbright
  2631.  
  2632.  move.w WHICHRIGHTPT,d0
  2633.  asl.w #2,d0
  2634.  add.w d4,d0
  2635.  move.w (a5,d0.w*2),d0
  2636.  bge.s .okpos2
  2637.  neg.w d0
  2638. .okpos2:
  2639.  
  2640.  add.w wallbrightoff,d0
  2641.  move.w d0,rightwallbright
  2642.  
  2643.  move.w currzone,d0
  2644.  move.b WHICHPBR,d4
  2645.  lsr.w #4,d4
  2646.  btst #3,d4
  2647.  beq.s .nototherzone2 
  2648.  move.w OTHERZONE,d0
  2649. .nototherzone2
  2650.  
  2651.  and.w #7,d4
  2652.  muls #40,d0
  2653.  add.w d0,d4
  2654.  
  2655.  move.w WHICHLEFTPT,d0
  2656.  asl.w #2,d0
  2657.  add.w d4,d0
  2658.  
  2659.  move.w (a5,d0.w*2),d0
  2660.  bge.s .okpos3
  2661.  neg.w d0
  2662. .okpos3:
  2663.  
  2664.  
  2665.  add.w wallbrightoff,d0
  2666.  move.w d0,leftwallTOPbright
  2667.  
  2668.  move.w WHICHRIGHTPT,d0
  2669.  asl.w #2,d0
  2670.  add.w d4,d0
  2671.  move.w (a5,d0.w*2),d0
  2672.  bge.s .okpos4
  2673.  neg.w d0
  2674. .okpos4:
  2675.  add.w wallbrightoff,d0
  2676.  move.w d0,rightwallTOPbright
  2677.  
  2678.  move.w leftend(pc),d4
  2679.  move.l #max3ddiv,d7
  2680.  
  2681.  move.w #-1,LASTSTIRRUP
  2682.  
  2683.  ifeq CHEESEY
  2684.  
  2685.  move.w rightwallTOPbright,d0
  2686.  cmp.w rightwallbright,d0
  2687.  bne.s gottagour
  2688.  move.w leftwallTOPbright,d0
  2689.  cmp.w leftwallbright,d0
  2690.  bne.s gottagour
  2691.  
  2692.  endc
  2693.  
  2694.  bsr walldraw
  2695.  bra.s nottagour
  2696.  
  2697. gottagour:
  2698.  bsr walldrawGOUR
  2699. nottagour:
  2700.  movem.l (a7)+,d7/a0/a5/a6
  2701.  rts
  2702.  
  2703. wallfacingaway:
  2704.  
  2705.  
  2706.  rts
  2707.  
  2708. PointBrightsPtr: dc.l 0
  2709. midpt: dc.l 0
  2710. dist1: dc.l 0
  2711. dist2: dc.l 0
  2712. VALAND: dc.w 0
  2713. VALSHIFT: dc.w 0
  2714. HORAND: dc.w 0
  2715.  
  2716. sinval: dc.w 0
  2717. cosval: dc.w 0
  2718.  
  2719. oldxoff: dc.w 0
  2720. oldzoff: dc.w 0
  2721.  
  2722. topclip: dc.w 0
  2723. botclip: dc.w 0
  2724. seethru: dc.w 0
  2725.  
  2726.